package com.good.service;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

import com.page.PageResults;

/**
 * 
 * @author ieei
 *
 * @param <T>entity实体
 * @param <ID>long类型id
 * baseService
 */
public interface BaseService<T, ID extends Serializable> {
	/**
	 * 保存实体
	 * @param entity
	 */
	public abstract void save(T entity);

	/**
	 * 保存或者更新实体
	 * @param entity
	 */
	public abstract void saveOrUpdate(T entity);

	/**
	 * 根据id获取实体
	 * @param id
	 * @return
	 */
	public abstract T load(ID id);

	/**
	 * 根据id查找实体
	 * @param id
	 * @return
	 */
	public abstract T find(ID id);

	/**
	 *删除实体 
	 * @param entity
	 */
	public abstract void delete(T entity);

	/**
	 * 根据id删除实体
	 * @param id
	 * @return
	 */
	public abstract boolean deleteById(ID id);

	/**
	 * 更新实体
	 * @param entity
	 */
	public abstract void update(T entity);
	/**
	 * 更新实体对象
	 * 
	 * @param entity
	 *            实体对象
	 * @param ignoreProperties
	 *            忽略属性
	 * @return 实体对象
	 */
	void  update(T entity,ID id, String... ignoreProperties);

	/**
	 * 
	 * @param entity
	 */
	public abstract void refresh(T entity);

	/**
	 * <删除所有>
     * @param entities 实体的Collection集合
	 * @param entities
	 */
	public abstract void deleteAll(Collection<T> entities);

	/**
	 * 执行hql
	 * @param hqlString
	 * @param values
	 */
	public abstract void queryHql(String hqlString, Object... values);

	/**
	 * 执行sql
	 * @param hqlString
	 * @param values
	 */
	public abstract void querySql(String sqlString, Object... values);

	/**
	 * 根据条件获取实体
	 * @param hqlString
	 * @param values
	 * @return
	 */
	public abstract T getByHQL(String hqlString, Object... values);

	/**
	 * 根据条件获取实体
	 * @param hqlString
	 * @param values
	 * @return
	 */
	public abstract T getBySQL(String sqlString, Object... values);

	/**
	 * 根据条件获取实体集合
	 * @param hqlString
	 * @param values
	 * @return
	 */
	public abstract List<T> getListByHQL(String hqlString, Object... values);

	/**
	 * 根据条件获取实体集合
	 * @param hqlString
	 * @param values
	 * @return
	 */
	public abstract List<T> getListBySQL(String sqlString, Object... values);


	/**
	 * 
	 * @param hql
	 * @param values
	 * @return
	 */
	public abstract Long countByHql(String hql, Object... values);

	/**
     * <HQL分页查询>
     * @param hql HQL语句
     * @param countHql 查询记录条数的HQL语句
     * @param pageNo 下一页
     * @param pageSize 一页总条数
     * @param values 不定Object数组参数
     * @return PageResults的封装类，里面包含了页码的信息以及查询的数据List集合
	 */
	public abstract PageResults<T> findPageByFetchedHql(String hql,
			String countHql, int pageNo, int pageSize, Object... values);
}
